package vue.panels;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.Vector;

import vue.Ui;
import controler.Joueur;
import controler.Protocol;
import controler.ProtocolException;
import controler.Table;
import model.ListeTableModel;
import vue.components.*;
/**
 * <p>Title: vue.ListTablesPanel </p>
 *
 * <p>
 * 	Description: Cette classe gere l'affichage du panneau de la liste des tables
 * </p>
 *
 * <p>Copyright: (c) 2008 FSSIM</p>
 *
 * <p>Company: FSSImock</p>
 *
 * @author Antoine Farnault
 * @author Augustin Couette
 * @version 1.0
 */
public class ListTablesPanel extends TPPanel {
    
	private static final long serialVersionUID = 1L;
	public Ui ui;
	public Vector<ChatPanel> chatPanels; // La liste des chatPanel qu'il instancie
	public Vector<JeuPanel>  jeuPanels;  // la liste des jeuPanel qu'il instancie
	
	/** Creates new form tablesPanel */
    public ListTablesPanel(Ui ui) {
    	this.ui = ui;
    	chatPanels = new Vector<ChatPanel>();
    	jeuPanels  = new Vector<JeuPanel>();
        initComponents();
    }

    // Variables declaration
    private javax.swing.JScrollPane jScrollPane1;
    private TPButton jouerButton;
    public static javax.swing.JTable listTable;
    private TPLabel passLabel;
    private TPPassewordField passText;
    private TPButton visiterButton;
    public static ListeTableModel listTableModel;
    private TPButton creerButton;
    // End of variables declaration

    /** This method is called from within the constructor to
     * initialize the form.
     */
    private void initComponents() {
    	setName("ListTablesPanel");
    	setTPTitle("Listes des tables");
        jScrollPane1 = new javax.swing.JScrollPane();
        jouerButton = new TPButton();
        visiterButton = new TPButton();
        creerButton = new TPButton();
        passText = new TPPassewordField();
        passLabel = new TPLabel();
        listTableModel = new ListeTableModel();

        listTable = new javax.swing.JTable();
        listTable.setModel(listTableModel);
        listTable.setBackground(new java.awt.Color(255, 255, 255));
        listTable.setFont(new java.awt.Font("Monospaced", 2, 14));
        
        listTable.setFocusable(false);
        listTable.setGridColor(new java.awt.Color(25, 81, 156));
        listTable.setOpaque(false);
        listTable.setShowHorizontalLines(false);
        listTable.setShowVerticalLines(false);
        listTable.getTableHeader().setReorderingAllowed(false);
        jScrollPane1.setViewportView(listTable);

        jouerButton.setText("Jouer");
        jouerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jouerButtonActionPerformed(evt);
            }
        });
        jouerButton.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jouerButtonKeyPressed(evt);
            }
        });
        creerButton.setText("Creer");
        creerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
            	creerButtonActionPerformed(evt);
            }
        });
        creerButton.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
            	creerButtonnKeyPressed(evt);
            }
        });
        visiterButton.setText("Visiter");
        visiterButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                visiterButtonActionPerformed(evt);
            }
        });
        visiterButton.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                visiterButtonKeyPressed(evt);
            }
        });
        
        listTable.addMouseListener(new java.awt.event.MouseListener(){
			public void mouseClicked(MouseEvent e) {
				try {
					if (Joueur.tablesRejointes.contains(listTableModel.getRow(listTable.getSelectedRow()))){
						jouerButton.setEnabled(false);
					}
					else{
						jouerButton.setEnabled(true);
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}

			public void mouseEntered(MouseEvent e) {				
			}

			public void mouseExited(MouseEvent e) {				
			}

			public void mousePressed(MouseEvent e) {				
			}

			public void mouseReleased(MouseEvent e) {				
			}
        	
        });
        
        
        
        
        passLabel.setText("Mot de passe :");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(passLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(passText, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 200, Short.MAX_VALUE)
                .addComponent(visiterButton, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jouerButton, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(creerButton, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 641, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(passLabel)
                    .addComponent(passText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(creerButton)
                    .addComponent(jouerButton)
                    .addComponent(visiterButton)))
        );
    }
    
    /**
     * Ajoute une table a la liste
     * @param t
     */
    public void addTableToList(controler.Table table){
    	listTableModel.addRow(table);
    	listTable.setModel(listTableModel);
    	listTable.updateUI();
    }
    
    /**
     * Action lorsque l'on appuie sur la touche visiter
     * @param evt
     */
    private void visiterButtonActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }
    /**
     * Action lorsque l'on appuie sur la touche jouer
     * @param evt
     */
    private void jouerButtonActionPerformed(java.awt.event.ActionEvent evt) {
    	if (!jouerButton.isEnabled()){
    		return;
    	}
    	int ligne;
    	try{
    		ligne = listTable.getSelectedRow();
    		
    		Table tableAJouer = listTableModel.getRow(ligne);
    		if(tableAJouer.privee){ // verification du mot de passe
    			String pass="";
    			for (int i = 0; i < passText.getPassword().length; i++) {
					pass += passText.getPassword()[i];
				}
    			if(!pass.equals(tableAJouer.motDePasse)){
    				ui.statutPanel.setInfo("Mot de passe de table non valide !");
    				passText.requestFocus();
    				return;
    			}
    		}
    		if(tableAJouer.nombreJoueurs >= tableAJouer.capacite ){
    			ui.statutPanel.setInfo("Cette table est pleine !");
    			return;
    		}

    		jouerButton.setEnabled(false); //pour le retour
    		
    		JeuPanel jeuPanel = new JeuPanel(ui, tableAJouer);
    		ChatPanel chatPanel = new ChatPanel(ui,tableAJouer.nom);
    		TablePanel tablePanel = new TablePanel(chatPanel,jeuPanel);
    		
    		// ajout a la liste
    		chatPanels.add(chatPanel);
    		jeuPanels.add(jeuPanel);
    		
    		Joueur.ui.cp.add(tablePanel, "tablePanel_"+tablePanel.jeuPanel.table.nom);
    		Joueur.ui.cp.layout.show(Joueur.ui.cp, "tablePanel_"+tablePanel.jeuPanel.table.nom);
        	
        	//Ajout de la table rejoint dans le select de la toolbar
        	Joueur.ui.toolBar.listeTableComboBoxModel.addTableToListe(tablePanel.jeuPanel.table.nom);
        	Joueur.ui.toolBar.tablesSelect.setModel(Joueur.ui.toolBar.listeTableComboBoxModel);
        	Joueur.ui.toolBar.listeTableComboBoxModel.setSelectedItem(tablePanel.jeuPanel.table.nom);
        	Joueur.ui.toolBar.tablesSelect.updateUI();
        	
        	// le joueur entre dans la table
        	Joueur.tablesRejointes.add(tableAJouer);
        	Protocol.snd_joinTable(tableAJouer.nom);
        	
    	} catch (ProtocolException e) {
			e.printStackTrace();
		} catch (Exception e) {
			//e.printStackTrace();
			Joueur.ui.statutPanel.setInfo("Aucune table selectionnee !");
		}
    }
    /**
     * Action quand on appuie sur la touche visiter avec la touche entree
     * @param evt
     */
    private void visiterButtonKeyPressed(java.awt.event.KeyEvent evt) {
    	// TODO : faire ce bouton
    }
    /**
     * Appuie sur entree sur le bouton jouer
     * @param evt
     */
    private void jouerButtonKeyPressed(java.awt.event.KeyEvent evt) {
    	jouerButtonActionPerformed(null);
    }
    /**
     * Action sur le bouton creer
     * @param evt
     */
	private void creerButtonActionPerformed(ActionEvent evt) {
		Joueur.ui.cp.layout.show(Joueur.ui.cp, "creerTablePanel");
		ui.creerTablePanel.proprietaireText.setText(Joueur.name);
		ui.creerTablePanel.nomText.setText("");
		ui.creerTablePanel.passText.setText("");
		ui.creerTablePanel.themeComboBox.setSelectedIndex(0);
		ui.creerTablePanel.capaciteSpinner.setValue(0);
		ui.creerTablePanel.passBox.setSelected(false);
		ui.creerTablePanel.passText.setEditable(false);
	}
	/**
	 * Appuis sur la touche entree sur le bouton creer
	 * @param evt
	 */
	private void creerButtonnKeyPressed(KeyEvent evt) {
		creerButtonActionPerformed(null);
	}
}
